/* LangChoice.java - Selection of source and target (destination) languages.
*
* Copyright (c) 2009-2011 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com>
* Distributed under EPL/LGPL/GPL/AL/BSD multi-license.
*/
package wiwordik.search_window;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.HBox;
import wikokit.base.wikipedia.language.LanguageType;
import wikokit.base.wikt.sql.TLang;
/** GUI element LangChoice contains checkboxes and text field with
* language codes. Source and target languages.
*/
public class LangChoice {
/** Language codes for words filtering, e.g. "ru en fr" */
TLang[] source_lang;
//var lang_source_value: String = bind lang_source_Text.rawText;
private final static TLang[] NULL_TLANG_ARRAY = new TLang[0];
LanguageType native_lang;
WordList word_list;
QueryTextString query_text_string;
LangChoiceBox lang_choicebox;
/** Language codes for words filtering by translation, e.g. "ru en fr" */
TLang[] dest_lang;
/** Whether list only articles which have these language codes */
boolean lang_source_checkbox_value = false;
/** Whether list only articles (in native language) which have translations
* into these language codes */
boolean lang_dest_checkbox_value = false;
CheckBox lang_source_checkbox = new CheckBox();// "Source language"
TextField lang_source_text = new TextField();
CheckBox lang_dest_checkbox = new CheckBox();
TextField lang_dest_text = new TextField();
public HBox lang_source_hbox = new HBox();
public HBox lang_dest_hbox = new HBox();
/** Gets language codes for words filtering, e.g. "ru en fr". */
public TLang[] getSourceLang() {
return source_lang;
}
/** Gets number of source languages for words filtering, e.g. 3 for "ru en fr". */
public int getNumberSourceLang() {
if(null == source_lang)
return 0;
return source_lang.length;
}
/** Checks whether the check box "Destination language" is selected. */
public boolean getDestLangSelected () {
return lang_dest_checkbox_value;
}
/** Interface to the real function updateWordList(). */
public void updateWordList() {
if(null == word_list) {
System.out.println("Error: LangChoice.updateWordList(): word_list is empty, non-initialized");
return;
}
word_list.updateWordList( word_list.getSkipRedirects(),
query_text_string.getWordValue()
);
query_text_string.saveWordValue();
}
public LangChoice () {
source_lang = NULL_TLANG_ARRAY;
dest_lang = NULL_TLANG_ARRAY;
}
/** Set parameters of the class.
* @param _word_list list of words in the dictionary (ListView)
* @param _query_text_string field with a user search text query
* @param _native_lang
*/
public void initialize(WordList _word_list,
QueryTextString _query_text_string,
LangChoiceBox _lang_choicebox,
String source_lang_codes,
LanguageType _native_lang
) {
native_lang = _native_lang;
word_list = _word_list;
query_text_string = _query_text_string;
lang_choicebox = _lang_choicebox;
// GUI
lang_source_checkbox.setText("Source language");
Tooltip tp = new Tooltip();
tp.setText( "Words filtering\n" +
"by language code\n" +
"(e.g. de, fr)");
lang_source_checkbox.setTooltip(tp);
lang_dest_checkbox.setText("Translation language");
Tooltip tp2 = new Tooltip();
tp2.setText( "List words only with translation\n" +
"to the languages defined\n" +
"by language code (e.g. de, fr)");
lang_dest_checkbox.setTooltip(tp2);
lang_source_text.setText(source_lang_codes);
lang_source_text.setDisable(true); //disable: bind not lang_source_CheckBox_value
lang_dest_text.setDisable(true);
lang_source_hbox.setSpacing(10);
lang_source_hbox.getChildren().addAll(lang_source_checkbox);
lang_source_hbox.getChildren().addAll(lang_source_text);
lang_dest_hbox.setSpacing(10);
lang_dest_hbox.getChildren().addAll(lang_dest_checkbox);
lang_dest_hbox.getChildren().addAll(lang_dest_text);
// If user clicks CheckBox and select filtering language codes, e.g.: uk de fr
lang_source_checkbox.selectedProperty().addListener(new ChangeListener<Boolean>() {
public void changed(ObservableValue<? extends Boolean> ov,
Boolean old_val, Boolean new_val)
{
boolean b_selected = lang_source_checkbox.isSelected();
if(b_selected) { // disable destination (target, translation) language check box and text field
lang_dest_checkbox.setSelected(false);
lang_dest_text.setDisable(true);
}
lang_source_text.setDisable(!b_selected);
if (lang_source_checkbox_value != b_selected) {
lang_source_checkbox_value = b_selected;
//System.out.println("lang_source_checkbox changed");
if(!b_selected) {
source_lang = NULL_TLANG_ARRAY; // without filter, all languages
updateWordList();
} else {
updateWordListIfLangSourceChanged();
}
}
}
});
/** User can edit text line with source filtering language codes, e.g.: uk de fr */
lang_source_text.addEventHandler(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
//System.out.println("lang_source_text.handle");
updateWordListIfLangSourceChanged();
}
});
// If user clicks destination CheckBox (only words with translations to the select filtering language codes, e.g.: uk de fr)
lang_dest_checkbox.selectedProperty().addListener(new ChangeListener<Boolean>() {
public void changed(ObservableValue<? extends Boolean> ov,
Boolean old_val, Boolean new_val)
{
boolean b_selected = lang_dest_checkbox.isSelected();
lang_dest_text.setDisable(!b_selected);
if(b_selected) { // disable source language check box and text field
lang_source_checkbox.setSelected(false);
lang_source_text.setDisable(true);
}
if (lang_dest_checkbox_value != b_selected) {
lang_dest_checkbox_value = b_selected;
if(!b_selected) {
dest_lang = NULL_TLANG_ARRAY; // without filter, with translations to all languages
updateWordList();
} else {
updateWordListIfLangDestChanged();
}
}
}
});
/** User can edit text line with desination (i.e. with translation) filtering language codes, e.g.: uk de fr */
lang_dest_text.addEventHandler(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
updateWordListIfLangDestChanged();
}
});
}
public void updateWordListIfLangSourceChanged () {
//System.out.println("LangChoice::updateWordListIfLangSourceChanged()");
String s = lang_source_text.getText();
// if list of source languages is the same then skip any changes
if(TLang.isEquals(source_lang, s))
return;
source_lang = TLang.parseLangCode(s);
// update ChoiceBox, let's select in dropdown menu the same language as user types in text field
if(source_lang.length > 0) {
if(source_lang[0].getLanguage() == native_lang) {
source_lang = NULL_TLANG_ARRAY; // without filter, all languages
// todo: list only native words
} else {
lang_choicebox.selectLanguageInChoiceBox( source_lang[0].getLanguage() );
}
}
updateWordList();
}
public void updateWordListIfLangDestChanged () {
String s = lang_dest_text.getText();
// if list of dest languages is the same then skip any changes
if(TLang.isEquals(dest_lang, s))
return;
dest_lang = TLang.parseLangCode(s);
updateWordList();
}
/* var lang_dest_checkbox: CheckBox = CheckBox {
text: "Translation language"
onMouseReleased: function(e:MouseEvent) {
if (lang_dest_checkbox_value != lang_dest_checkbox.selected) {
lang_dest_checkbox_value = lang_dest_checkbox.selected;
if(not lang_dest_checkbox.selected) {
dest_lang = null; // without filer, all languages
updateWordList();
lang_source_CheckBox.disable = false;
} else {
lang_source_CheckBox.disable = true;
//System.out.println("CheckBox 1. lang_dest_text={lang_dest_text.rawText}, source_lang.size={source_lang.size()}");
// if list of dest languages is the same then skip any changes
if(TLang.isEquals(dest_lang, lang_dest_text.rawText))
return;
dest_lang = TLang.parseLangCode(lang_dest_text.rawText);
//System.out.println("CheckBox 2. OK. It's changed. dest_lang.size={source_lang.size()}");
updateWordList();
}
}
}
}
}
var lang_dest_text: TextBox = TextBox {
disable: bind not lang_dest_checkbox_value
blocksMouse: true
columns: 12
selectOnFocus: true
text: "en de fr os uk"
onKeyTyped: function(e:KeyEvent){
//System.out.println("TextBox 1. lang_dest_text={lang_dest_text.rawText}, dest_lang.size={dest_lang.size()}");
// if list of dest languages is the same then skip any changes
if(TLang.isEquals(dest_lang, lang_dest_text.rawText))
return;
dest_lang = TLang.parseLangCode(lang_dest_text.rawText);
//System.out.println("TextBox 2. OK. It's changed. dest_lang.size={dest_lang.size()}");
updateWordList();
}
}
public var lang_source_HBox: HBox = HBox {
content: [
lang_source_CheckBox, lang_source_Text
]
spacing: 10
};
public var lang_dest_hbox: HBox = HBox {
content: [
lang_dest_checkbox, lang_dest_text
]
spacing: 10
};
*/
}